package JDBC.Day10_Spring.JDBCTemplateExercise;

import JDBC.Day10_Spring.utils.JDBCUtils;
import org.junit.Test;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

/**
 *  练习
 *      1. 修改1号数据的salary为10000
 *      2. 添加一条记录
 *      3. 删除刚才添加的记录
 *      4. 查询id为1的记录，将其封装为Map集合
 *      5. 查询所有记录，将其封装为List
 *      6. 查询所有记录，将其封装为Emp对象的List集合
 *      7. 查询总记录数
 */
public class Exercise {
    // Junit单元测试 可以让方法独立执行

    //1. 获取Template对象
    private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());

    /**
     *  1. 修改1号数据的salary为10000
     */
    @Test
    public void test1() {
        //2. 定义sql
        String sql = "update emp set salary = 10000 where id = ?";
        int count = template.update(sql, 1001);
        if(count != 0) {
            System.out.println("修改成功");
        } else {
            System.out.println("修改失败");
        }

    }

    /**
     *  2. 添加一条记录
     */
    @Test
    public void test2() {
        //2. 定义sql
        String sql = "insert into emp(id, ename, dept_id) values(null, ?, ?)";
        int count = template.update(sql, "云天明", 10);
        System.out.println(count);

    }

    /**
     *  3. 删除刚才添加的记录
     */
    @Test
    public void test3() {
        String sql = "delete from emp where ename = ?";
        int count = template.update(sql, "云天明");
        System.out.println(count);
    }

    /**
     *  4. 查询id为1001的记录，将其封装为Map集合
     */
    @Test
    public void test4() {
        String sql = "select * from emp where id = ?";
        // 只能封装一条记录进Map集合 两条或者0条都会报错
        Map<String, Object> map = template.queryForMap(sql, 1001);
        System.out.println(map);

    }

    /**
     *  5. 查询所有记录，将其封装为List
     */
    @Test
    public void test5() {
        String sql = "select * from emp";
        // 将每条记录封装成Map集合，然后再装载进List集合
        List<Map<String, Object>> lists = template.queryForList(sql);
        for (Map<String, Object> l : lists) {
            System.out.println(l);
        }

    }

    /**
     *  6. 查询所有记录，将其封装为Emp对象的List集合
     */
    @Test
    public void test6() {
        String sql = "select * from emp";
        // 使用query()方法, 第二个参数传入一个实现RowMapper接口的实现类，并实现方法mapRow
        List<Emp> lists = template.query(sql, new RowMapper<Emp>() {

            @Override
            public Emp mapRow(ResultSet resultSet, int i) throws SQLException {
                Emp emp = new Emp();
                emp.setId(resultSet.getInt("id"));
                emp.setEname(resultSet.getString("ename"));
                emp.setJob_id(resultSet.getInt("job_id"));
                emp.setMgr(resultSet.getInt("mgr"));
                emp.setJoindate(resultSet.getString("joindate"));
                emp.setSalary(resultSet.getDouble("salary"));
                emp.setBonus(resultSet.getDouble("bonus"));
                emp.setDept_id(resultSet.getInt("dept_id"));
                return emp;
            }
        });
        for (Emp list : lists) {
            System.out.println(list);
        }
    }

    /**
     *  6. 查询所有记录，将其封装为Emp对象的List集合
     */
    @Test
    public void test6_2() {
        String sql = "select * from emp";
        // 使用query()方法, 第二个参数传入BeanPropertyRowMapper对象，泛型和参数列表填入目标Bean类
        // 注意：使用这个方法的话 Bean类中就要避免采用基本数据类型
        //      因为如果记录中有null值，就会报错，因为基本数据类型不能存储null
        //      所以需要将Bean类中的值类型改为包装类
        List<Emp> lists = template.query(sql, new BeanPropertyRowMapper<Emp>(Emp.class));
        for (Emp list : lists) {
            System.out.println(list);
        }

    }

    /**
     *  7. 查询总记录数
     */
    @Test
    public void test7() {
        // 使用聚合函数计算主键id的个数
        String sql = "select count(id) from emp";
        // queryForObject()方法常用来执行聚合函数
        Integer count = template.queryForObject(sql, Integer.class);
        System.out.println(count);

    }

}
